import def from './def'
import defineReactive from './defineReactive'
import observe from './observe'
import Dep from './Dep'
import { arrayMethods } from './array'
// 核心观察者类，负责递归处理对象的属性。
export default class Observer {
  constructor(value) {
    // console.log('我是Observer构造器', value)
    // 每一个Observer实例身上，都有一个dep属性
    this.dep = new Dep()
    // 给实例， 构造函数中的this指向该实例。this.__ob__ = this, 即在Observer实例上添加了 __ob__  属性,值是这次new的实例
    def(value, '__ob__', this, false)
    // 不要忘记初心， Observer类的目的是：将一个正常的object转换为每个层级的属性都是响应式（可以被侦测的）的object
    // 判断是对象还是数组
    if (Array.isArray(value)) {
      // 如果是数组，要非常强行的蛮干，将这个数组的原型，指向arrayMethods
      Object.setPrototypeOf(value, arrayMethods)
      // 让这个数组变的observe
      this.observeArray(value)
    } else {
      this.walk(value)
    }
  }
  // 遍历
  walk(value) {
    for (let key in value) {
      defineReactive(value, key)
    }
  }
  // 数组的特殊遍历
  observeArray(arr) {
    for (let i = 0, l = arr.length; i < l; i++) {
      // 逐个进行observe处理
      observe(arr[i])
    }
  }
}
